#!/bin/sh

MOD_NAME=netflow
MOD_DEFAULTS=/opt/$MOD_NAME/etc/defaults
MOD_SETTINGS=/opt/$MOD_NAME/etc/settings

NFEXPIRE_BIN=/opt/$MOD_NAME/bin/nfexpire
NFCAPD_BIN=/opt/$MOD_NAME/bin/nfcapd
NFCAPD_PORT=2055
NFCAPD_STORE=/var/tmp/$MOD_NAME

IT4=/sbin/iptables
IT6=/sbin/ip6tables

[ -f "$MOD_SETTINGS" ] || cp $MOD_DEFAULTS $MOD_SETTINGS
. $MOD_SETTINGS

case "$1" in

  start)
    echo -n "Starting module $MOD_NAME collector: "
    if [ "$MOD_NETFLOW_COLLECTOR_ENABLED" == "1" ]; then
      mkdir -p $NFCAPD_STORE
      LOCAL_DESTINATION="127.0.0.1:$NFCAPD_PORT"
      # nfcapd by default uses extensions 1 and 2
      # create commands to modify these defaults to what the user requested
      EXTENSIONS_ARG="-2"
      if [ "$MOD_NETFLOW_STORE_IF_SNMP_NUMBER" == "0" ]; then EXTENSIONS_ARG="$EXTENSIONS_ARG,-1"; fi
      if [ "$MOD_NETFLOW_STORE_NEXT_HOP"       == "1" ]; then EXTENSIONS_ARG="$EXTENSIONS_ARG,+4"; fi
      if [ "$MOD_NETFLOW_STORE_EX_IP_ADDRESS"  == "1" ]; then EXTENSIONS_ARG="$EXTENSIONS_ARG,+13"; fi
      if [ "$MOD_NETFLOW_STORE_EX_ENGINE_ID"   == "1" ]; then EXTENSIONS_ARG="$EXTENSIONS_ARG,+14"; fi
      if [ "$MOD_NETFLOW_STORE_RECEPTION_TIME" == "1" ]; then EXTENSIONS_ARG="$EXTENSIONS_ARG,+16"; fi
      $NFEXPIRE_BIN -u $NFCAPD_STORE -t $MOD_NETFLOW_STORAGE_EXPIRATION >/dev/null
      if [ ! -z "$MOD_NETFLOW_STORAGE_INTERVAL" ]; then
        INTERVAL_ARG="-t $MOD_NETFLOW_STORAGE_INTERVAL"
      fi
      $NFCAPD_BIN -D -p $NFCAPD_PORT -T $EXTENSIONS_ARG -l $NFCAPD_STORE -w -e $INTERVAL_ARG 2>/dev/null
      if [ $? -ne 0 ]; then
        echo "failed"
        exit 1
      fi
      echo "done"
    else
      echo "skipped"
    fi
    echo -n "Starting module $MOD_NAME probe: "
    if [ "$MOD_NETFLOW_PROBE_ENABLED" == "1" ]; then
      if [ ! -z "$MOD_NETFLOW_SAMPLER_TYPE" ]; then
        SAMPLER_ARG="$MOD_NETFLOW_SAMPLER_TYPE:$MOD_NETFLOW_SAMPLER_RATE"
      fi
      KERNEL_VER=`cat /proc/version | sed -nre 's/^[^0-9]*(([0-9]+\.)*[0-9]+).*/\1/p'`
      insmod /opt/$MOD_NAME/lib/modules/$KERNEL_VER/kernel/extras/ipt_NETFLOW.ko \
              protocol=$MOD_NETFLOW_PROBE_PROTOCOL \
              destination=$LOCAL_DESTINATION,$MOD_NETFLOW_REMOTE_COLLECTOR \
              engine_id=$MOD_NETFLOW_PROBE_ENGINE_ID \
              sampler=$SAMPLER_ARG \
              inactive_timeout=$MOD_NETFLOW_INACTIVE_TIMEOUT \
              active_timeout=$MOD_NETFLOW_ACTIVE_TIMEOUT
      if [ $? -ne 0 ]; then
        echo "failed"
        exit 1
      fi
      # NetFlow v5 does not support IPv6
      if [ $MOD_NETFLOW_PROBE_PROTOCOL != "5" ]; then
        IT_LIST="$IT4 $IT6"
      else
        IT_LIST="$IT4"
      fi
      for IT in $IT_LIST; do
        [ -x $IT ] || continue
        IPT="$IT -t filter"
        $IPT -I FORWARD -j NETFLOW
        $IPT -I INPUT -j NETFLOW
        $IPT -I OUTPUT -j NETFLOW

        if [ $? -ne 0 ]; then
          echo "failed"
          exit 1
        fi
      done
      echo "done"
    else
      echo "skipped"
    fi
    exit 0;
  ;;

  stop)
    echo -n "Stopping module $MOD_NAME: "
    killall nfcapd 2>/dev/null
    for IT in $IT4 $IT6; do
      [ -x $IT ] || continue
      IPT="$IT -t filter"
      $IPT -D FORWARD -j NETFLOW 2>/dev/null
      $IPT -D INPUT -j NETFLOW 2>/dev/null
      $IPT -D OUTPUT -j NETFLOW 2>/dev/null
    done
    cat /proc/modules | grep -q ipt_NETFLOW && rmmod ipt_NETFLOW
    echo "done"
    exit 0;
  ;;

  restart)
    $0 stop
    $0 start
    exit $?;
  ;;

  status)
    echo -n "Module $MOD_NAME collector is "
    if [ "$MOD_NETFLOW_COLLECTOR_ENABLED" != "1" ]; then
      echo "disabled"
    else
      echo "enabled"
    fi
    echo -n "Module $MOD_NAME probe is "
    if [ "$MOD_NETFLOW_PROBE_ENABLED" != "1" ]; then
      echo "disabled"
    else
      echo "enabled"
    fi
    exit 0;
  ;;

  defaults)
    cp $MOD_DEFAULTS $MOD_SETTINGS 2>/dev/null
    exit 0
  ;;

  *)
    echo "Usage: $0 {start|stop|restart|status|defaults}"
    exit 1
  ;;

esac
